/*!
 * \file EventNotifier.h
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 事件通知器定义文件
 * 
 * \details 本文件定义了EventNotifier类，用于在WonderTrader回测框架中进行事件通知和数据广播。
 *          事件通知器的主要功能包括：
 *          - 通过消息队列系统发送事件通知
 *          - 广播策略运行状态和结果数据
 *          - 发送资金变化通知
 *          - 管理消息队列服务器的生命周期
 *          - 支持自定义消息主题和数据格式
 */
#pragma once

#include <queue>

#include "../Includes/WTSMarcos.h"
#include "../Includes/WTSObject.hpp"
#include "../Share/StdUtils.hpp"

/*!< 创建消息队列服务器函数指针类型 */
typedef unsigned long(*FuncCreateMQServer)(const char*, bool);

/*!< 销毁消息队列服务器函数指针类型 */
typedef void(*FuncDestroyMQServer)(unsigned long);

/*!< 发布消息函数指针类型 */
typedef void(*FundPublishMessage)(unsigned long, const char*, const char*, unsigned long);

/*!< 日志回调函数指针类型 */
typedef void(*FuncLogCallback)(unsigned long, const char*, bool);

/*!< 注册回调函数指针类型 */
typedef void(*FuncRegCallbacks)(FuncLogCallback);


NS_WTP_BEGIN
class WTSVariant;

/*!
 * \class EventNotifier
 * \brief 事件通知器类
 * 
 * \details EventNotifier是WonderTrader回测框架中的事件通知组件，负责将回测过程中的重要事件和数据
 *          通过消息队列系统广播给外部监控程序或分析工具。
 *          
 *          主要功能：
 *          - 初始化和管理消息队列服务器连接
 *          - 发送策略状态变化事件通知
 *          - 广播实时交易数据和回测结果
 *          - 发送资金变化和盈亏统计信息
 *          - 支持多种消息主题分类
 *          
 *          使用场景：
 *          - 实时监控回测策略的运行状态
 *          - 向外部系统推送交易信号和结果
 *          - 集成第三方分析和可视化工具
 *          - 构建分布式回测监控系统
 */
class EventNotifier
{
public:
	/*!
	 * \brief 构造函数
	 * 
	 * \details 初始化事件通知器，设置默认参数。
	 */
	EventNotifier();
	
	/*!
	 * \brief 析构函数
	 * 
	 * \details 清理事件通知器资源，关闭消息队列连接。
	 */
	~EventNotifier();

public:
	/*!
	 * \brief 初始化事件通知器
	 * 
	 * \param cfg 配置参数，包含消息队列服务器的配置信息
	 * \return 成功返回true，失败返回false
	 * 
	 * \details 根据配置参数初始化事件通知器：
	 *          - 解析消息队列服务器地址和端口
	 *          - 加载消息队列动态库
	 *          - 创建消息队列服务器连接
	 *          - 注册必要的回调函数
	 *          
	 *          配置示例：
	 *          \code
	 *          {
	 *              "url": "tcp://127.0.0.1:5555",
	 *              "sync": true
	 *          }
	 *          \endcode
	 */
	bool	init(WTSVariant* cfg);
	
	/*!
	 * \brief 发送事件通知
	 * 
	 * \param evtType 事件类型字符串
	 * 
	 * \details 发送指定类型的事件通知到消息队列：
	 *          - 支持自定义事件类型
	 *          - 事件类型用于区分不同的通知消息
	 *          - 常见事件类型：策略启动、策略停止、错误告警等
	 */
	void	notifyEvent(const char* evtType);
	
	/*!
	 * \brief 发送数据通知
	 * 
	 * \param topic 消息主题
	 * \param data 数据指针
	 * \param dataLen 数据长度
	 * 
	 * \details 发送指定主题的数据到消息队列：
	 *          - 支持二进制数据传输
	 *          - 主题用于消息分类和路由
	 *          - 常见主题：tick数据、K线数据、交易信号等
	 */
	void	notifyData(const char* topic, void* data , uint32_t dataLen);
	
	/*!
	 * \brief 发送资金变化通知
	 * 
	 * \param topic 消息主题
	 * \param uDate 日期，格式为YYYYMMDD
	 * \param total_profit 总盈亏
	 * \param dynprofit 动态盈亏
	 * \param dynbalance 动态权益
	 * \param total_fee 总手续费
	 * 
	 * \details 发送策略的资金变化信息到消息队列：
	 *          - 用于实时监控策略的盈亏状况
	 *          - 包含总盈亏、动态盈亏、权益变化等关键指标
	 *          - 支持按日期统计资金变化
	 *          - 便于外部系统进行风险控制和绩效分析
	 */
	void	notifyFund(const char* topic, uint32_t uDate, double total_profit, double dynprofit, double dynbalance, double total_fee);
	

private:
	std::string		m_strURL;			/*!< 消息队列服务器URL地址 */
	uint32_t		_mq_sid;			/*!< 消息队列服务器ID */
	FuncCreateMQServer	_creator;		/*!< 创建消息队列服务器函数指针 */
	FuncDestroyMQServer	_remover;		/*!< 销毁消息队列服务器函数指针 */
	FundPublishMessage	_publisher;		/*!< 发布消息函数指针 */
	FuncRegCallbacks	_register;		/*!< 注册回调函数指针 */
};

NS_WTP_END